﻿using ExcellentProjectPlus.Dominio.Seguridades;
using ExcellentProjectPlus.Dominio.Seguridades.Repositorios.Atribuciones;
using ExcellentProjectPlus.Dominio.Seguridades.Repositorios.Docentes;
using ExcellentProjectPlus.Dominio.Seguridades.Repositorios.Estudiantes;
using ExcellentProjectPlus.Dominio.Seguridades.Repositorios.Perfiles;
using ExcellentProjectPlus.Dominio.Seguridades.Repositorios.PerfilPersonas;
using ExcellentProjectPlus.Dominio.Seguridades.Repositorios.Personas;
using ExcellentProjectPlus.Dominio.Seguridades.Repositorios;
using ExcellentProjectPlus.Infraestructura.Data.Seguridad.Modelo;
using ExcellentProjectPlus.Infraestructura.Data.Seguridad.Repositorios;
using ExcellentProjectPlus.Infraestructura.Transversales.Logging;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExcellentProjectPlus.Infraestructura.Data.Seguridad.UnidadDeTrabajo
{
    public class UnidadDeTrabajoSeguridades : IUnidadDeTrabajoSeguridades, IDisposable
    {
        DbContext context { get; set; }
        ITraceManager _traceManager;

        private RepositorioAtribuciones repositorioAtribuciones;
        private RepositorioDocentes repositorioDocentes;
        private RepositorioEstudiantes repositorioEstudiantes;
        private RepositorioPerfiles repositorioPerfiles;
        private RepositorioPerfilPersonas repositorioPerfilPersonas;
        private RepositorioPersonas repositorioPersonas;

        #region Constructores
        public UnidadDeTrabajoSeguridades(ITraceManager traceManager)
        {
            this._traceManager = traceManager;
            context = new SeguridadContext();
            context.Configuration.ProxyCreationEnabled = false;
        }
        #endregion

        public IRepositorioAtribuciones RepositorioAtribuciones
        {
            get
            {
                if(this.repositorioAtribuciones == null)
                {
                    this.repositorioAtribuciones = new RepositorioAtribuciones(context, _traceManager);
                }
                return repositorioAtribuciones;
            }
        }

        public IRepositorioDocentes RepositorioDocentes
        {
            get
            {
                if (this.repositorioDocentes == null)
                {
                    this.repositorioDocentes = new RepositorioDocentes(context, _traceManager);
                }
                return repositorioDocentes;
            }
        }

        public IRepositorioEstudiantes RepositorioEstudiantes
        {
            get
            {
                if(this.repositorioEstudiantes == null)
                {
                    this.repositorioEstudiantes = new RepositorioEstudiantes(context, _traceManager);
                }
                return repositorioEstudiantes;
            }
        }

        public IRepositorioPerfiles RepositorioPerfiles
        {
            get
            {
                if(this.repositorioPerfiles == null)
                {
                    this.repositorioPerfiles = new RepositorioPerfiles(context, _traceManager);
                }
                return repositorioPerfiles;
            }
        }

        public IRepositorioPerfilPersonas RepositorioPerfilPersonas
        {
            get
            {
                if(this.repositorioPerfilPersonas == null)
                {
                    this.repositorioPerfilPersonas = new RepositorioPerfilPersonas(context, _traceManager);
                }
                return repositorioPerfilPersonas;
            }
        }

        public IRepositorioPersonas RepositorioPersonas
        {
            get
            {
                if (this.repositorioPersonas == null)
                {
                    this.repositorioPersonas = new RepositorioPersonas(context, _traceManager);
                }
                return repositorioPersonas;
            }
        }

        public void Confirmar()
        {
            context.SaveChanges();
        }

        private bool disposed = false;
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    context.Dispose();
                }
            }
            this.disposed = true;
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        public Dominio.Core.IRepositorio<object> ObtenerRepositorio()
        {
            throw new NotImplementedException();
        }

    }
}